1)Наследование — это механизм, при котором один класс  может заимствовать свойства и методы другого класса (базового). Это способствует повторному использованию кода, так как позволяет создавать новые классы на основе существующих, избегая дублирования. 
2)  public: Члены базового класса сохраняют свои уровни доступа в производном классе.

    protected: Публичные и защищённые члены базового класса становятся защищёнными в производном классе.

    private: Все члены базового класса становятся приватными в производном классе.

3) Перегрузка (Overloading) : Методы с одним и тем же именем, но разными параметрами в одном классе. 
   Переопределение (Overriding) : Переопределение виртуального метода базового класса в производном классе.

4) Проблема : Если два класса наследуют общий базовый класс, а третий класс наследует оба этих класса, возникает неоднозначность (дублирование общего базового класса).
   Решение : Использование виртуального наследования  для предотвращения дублирования.
   class B : virtual public A {};
5) Абстрактный класс  — это класс, содержащий хотя бы один чисто виртуальный метод (= 0). Он не может иметь экземпляров и используется как базовый класс для других классов.
Использование : Когда нужно определить общий интерфейс для группы производных классов.


class Shape {
public:
    virtual void draw() = 0; // Чисто виртуальный метод
};
class Circle : public Shape {
public:
    void draw() override { cout << "Drawing Circle" << endl; }
};
